"""控制中心"""

from src.core import log
from src.core import Enums
from src.apps.hosting.stater import Jar_manager
from src.core.variables.status import (
    ERROR_CODE,
    ERROR_CODE_CUSTOMIZE,
    SUCCESS_CODE,
    SUCCESS_CODE_CUSTOMIZE,
)
from src.schema.hosting import control_java_schema, control_static_schema
from src.core.variables.cls import HOSTING_JAVA_RUNNER_DICT, HOSTING_STATIC_RUNNER_DICT


def java(schema: control_java_schema):
    """
    将jar程序全生命周期进行抽象并赋予启动、停止、日志捕获等能力，使用多线程实现高性能控制中心
    """
    try:
        runner = HOSTING_JAVA_RUNNER_DICT.get(schema.app_id, None)
        if runner:
            match runner.status:
                # 未运行
                case Enums.AppStatus.JAVA_STATUS.DEAD:
                    match schema.behavior:
                        case Enums.JarBehavior.START | Enums.JarBehavior.RESTART:
                            runner.start()
                            log.INFO(f"应用[{schema.app_id}]启动成功!")
                            return SUCCESS_CODE.RUN_SUCCESS()
                        case Enums.JarBehavior.STOP:
                            log.WARNING(f"{schema.app_id} 未运行，无法停止！")
                            return ERROR_CODE.APP_STOPED()
                # 已运行
                case Enums.AppStatus.JAVA_STATUS.RUNNING:
                    match schema.behavior:
                        case Enums.JarBehavior.START:
                            log.WARNING(f"{schema.app_id} 已经在运行中，无法重复启动！")
                            return ERROR_CODE.APP_RUNNING()
                        case Enums.JarBehavior.STOP:
                            log.INFO(f"正在停止 {schema.app_id} ...")
                            runner.stop()
                            return SUCCESS_CODE.STOP_SUCCESS()
                        case Enums.JarBehavior.RESTART:
                            log.INFO(f"正在重启 {schema.app_id} ...")
                            runner.stop()
                            runner.start()
                            return SUCCESS_CODE.APP_RUNNING()
                case Enums.AppStatus.JAVA_STATUS.ERROR:
                    runner.panic_protect()
                case Enums.AppStatus.JAVA_STATUS.CRITICAL:
                    log.ERROR(
                        f"应用[{runner.app.alias}]可能处于严重错误状态，请重新部署新的软件包或回滚到上一个版本！"
                    )
                    return ERROR_CODE_CUSTOMIZE(
                        f"应用[{runner.app.alias}]可能处于严重错误状态，请重新部署新的软件包或回滚到上一个版本！",
                        500,
                    )
        return ERROR_CODE_CUSTOMIZE(f"应用[{schema.app_id}]不存在！", 400)
    except Exception as e:
        return ERROR_CODE_CUSTOMIZE(f"应用[{schema.app_id}]控制失败: {str(e)}", 500)


def static(schema: control_static_schema):
    """控制前端应用"""
    runner = HOSTING_STATIC_RUNNER_DICT.get(schema.app_id, None)
    if runner:
        match runner.status:
            case Enums.AppStatus.STATIC_STATUS.MAPPTING:
                match schema.behavior:
                    case Enums.StaticBehavior.ENABLED:
                        log.WARNING(f"{schema.app_id} 已经启用，无法重复启用！")
                        return ERROR_CODE.APP_RUNNING()
                    case Enums.StaticBehavior.DISABLED:
                        log.INFO(f"正在禁用 {schema.app_id} ...")
                        runner.disable()
                        return SUCCESS_CODE.STOP_SUCCESS()
                    case _:
                        return ERROR_CODE_CUSTOMIZE(f"未知行为: {schema.behavior}", 400)
            case Enums.AppStatus.STATIC_STATUS.UNMAPPED:
                match schema.behavior:
                    case Enums.StaticBehavior.ENABLED:
                        log.INFO(f"正在启用 {schema.app_id} ...")
                        runner.enable()
                        return SUCCESS_CODE.RUN_SUCCESS()
                    case Enums.StaticBehavior.DISABLED:
                        log.WARNING(f"{schema.app_id} 未启用，无法禁用！")
                        return ERROR_CODE.APP_STOPED()
                    case _:
                        return ERROR_CODE_CUSTOMIZE(f"未知行为: {schema.behavior}", 400)
            case Enums.AppStatus.STATIC_STATUS.ERROR:
                runner.panic_protect()
            case Enums.AppStatus.STATIC_STATUS.CRITICAL:
                log.ERROR(f"应用[{runner.app.alias}]可能处于严重错误状态，请重新部署新的软件包或回滚到上一个版本！")
    return ERROR_CODE_CUSTOMIZE(f"控制失败...", 400)